import buffer from '@ohos.buffer';
import util from '@ohos.util';
import { ExtVsMimeDict } from './MimeExtMap';


export class StringUtil {
  static uint8ArrayToString(u8a:Uint8Array): string {
    let u8aBuffer = buffer.from(u8a);
    return u8aBuffer.toString()
  }

  static uint8ArrayToBase64string(u8a:Uint8Array): string {
    let base64HP = new util.Base64Helper();
    let encodeU8a = base64HP.encodeSync(u8a);
    return StringUtil.uint8ArrayToString(encodeU8a)
  }

  /**
   * 从字符串中获取cid
   * @param source 原始字符串
   * @returns 符合要求的cid字符串
   * @description 通过解析eml获取到的cid，可能会被包含<>或者""中
   */
  static getCid(source:string): string {
    if ((source.startsWith("<") && source.endsWith(">")) || (source.startsWith("\"") && source.endsWith("\""))) {
      return source.substring(1, source.length - 1)
    }
    return source
  }

  /**
   * 计算字符串的hash值
   * @param str
   * @returns 字符串hash值
   */
  static hashCode(str:string): number {
    return str.split("").reduce(
      function(a, b) {
        a= ((a<<5) - a ) + b.charCodeAt(0);
        return a&a
      }, 0);
  }
  /**
   * 生成存于本地沙盒的文件名
   * @param id 文件id
   * @param name 文件名
   * @param fileType 文件后缀名
   * @returns 文件存于本地沙盒时的名字
   * @description 文件名可为空，或者不带后缀，或者有额外字符串等情况，存本地需要转换为hash值统一替换
   * @discuss fileType应该是返回准确文件后缀名，但SDK可能是解析出来是对照MIMEType(例如svg为image/svg+xml，传入的fileType为subtype:svg+xml)，所以需要做一次转换
   */
  static uniqName(id: string, name: string | null, fileType: string | null): string {
    let cid = StringUtil.getCid(id)
    let fname = name || cid
    let hashCode = StringUtil.hashCode(fname)
    if (fileType) {
      let ext = Object.entries(ExtVsMimeDict).find(item => item[1].endsWith(fileType))
      if (ext) {
        return `${hashCode}.${ext[0]}`
      }
    }
    return `${hashCode}`
  }

  /**
   * 字符是否是一个字母
   * A-Z
   * a-z
   * @param c
   * @returns
   */
  static isLetter(charcode:number) {
    return (charcode >= 'A'.charCodeAt(0) && charcode <= 'Z'.charCodeAt(0)) || (charcode >= 'a'.charCodeAt(0) && charcode <= 'z'.charCodeAt(0))

  }

  /**
   * 字符是否是一个数字
   * @param c
   */
  static isDigit(charcode:number) {
    return charcode >= '0'.charCodeAt(0) && charcode <= '9'.charCodeAt(0)
  }

  static isNullOrEmpty(str:string|null) {
     return !(str && str.length > 0);
  }

  /**
   * 移除首端和末尾的c.
   * @param str
   * @param c
   */
  static trim(str:string,c:string):string {
    if(str[0] == c) {
      str = str.slice(1);
    }
    let lastIndex = str.length - 1;
    if(str[lastIndex] == c) {
      str = str.substring(0,lastIndex -1);
    }
    return str;
  }
  static trimEnd(str:string,c:string):string {
    let lastIndex = str.length - 1;
    if(str[lastIndex] == c) {
      str = str.substring(0,lastIndex -1);
    }
    return str;
  }
}
